package Classes;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.Icon;

/**
 * Classe para representar nosso sistema de Biblioteca Colaborativa.
 *
 * @author Andreza Raquel
 */
public class Sistema {

    private List<Usuario> usuarios;
    private Usuario usuarioAtivo;

    /**
     * Construtor da classe
     */
    public Sistema() {
        abreSistema();
       
    }

    /**
     * Abre o sistema
     */
    private void abreSistema() {
        try {
            usuarios = ArquivoBD.carregaUsuarios();
        } catch (Exception e) {
            System.out.println("Arquivo de usuarios nao carregado.");
            System.exit(1);
        }
    }

    /**
     * Fecha o sistema
     */
    public void fechaSistema() {
        try {
            ArquivoBD.salvaUsuarios(usuarios);
        } catch (Exception e) {
            System.out.println("Arquivos do sistema nao encerrados.");
            System.exit(1);
        }
    }

    /**
     * Cadastra um novo usuário
     *
     * @param novoUsuario Usuario a ser cadastrado
     */
    public void cadastraUsuario(Usuario novoUsuario) {
        usuarios.add(novoUsuario);
    }

    public Usuario procuraUsuario(String login, String senha) {
        for (Usuario u : usuarios) {
           if (u.getLogin().equals(login) && u.getSenha().equals(senha))
              return u;
        }
        return null;
    }
    
    public Usuario procuraUsuario(String login) {
        for (Usuario u : usuarios) {
            if (u.getLogin().equals(login))
                return u;
        }
        return null;
    }
    
    
    /**
     * Valida o userName de cadastro de um usuario.
     *
     * @param userName Login digitado no campo
     * @return true se não houver ninguem com aquele userName.
     */
    public boolean validaUserName(String userName) {
        for (Usuario u : usuarios) {
            if (u.getLogin().equals(userName))
                return false;
        }
        return true;
    }

    /**
     * Valida o login do Usuario Cadastrado.
     *
     * @param userName O nome de usuario.
     * @param senha A senha do usuario.
     * @return True se eh um login valido.
     */
    public boolean validaLogin(String userName, String senha) {
        for (Usuario usuario : usuarios) {
            if (usuario.validarLogin(userName, senha)) {
                usuarioAtivo = usuario;
                return true;
            }
        }
        return false;
    }

    /**
     * @return Retorna a lista de usuarios
     */
    public List<Usuario> getLista() {
        return usuarios;
    }
    
    /**
     * Define um novo usuario ativo
     *
     * @param novoUsuario
     */
    public void setUsuarioAtivo(Usuario novoUsuario) {
        this.usuarioAtivo = novoUsuario;
    }

    /**
     * @return O usuario ativo no momento
     */
    public Usuario getUsuarioAtivo() {
        return usuarioAtivo;
    }
    
    /**
     * Acessor do UserName;
     *
     * @return O userName do usuario.
     */
    public String getUserName() {
        return usuarioAtivo.getLogin();
    }

    /**
     * Acessor da Senha.
     *
     * @return A senha do usuario.
     */
    public String getSenhaUsuario() {
        return usuarioAtivo.getSenha();
    }

    /**
     * Acessor do nome.
     *
     * @return O nome do usuario.
     */
    public String getNomeUsuario() {
        return usuarioAtivo.getPessoa().getNome();
    }

    /**
     * Acessor do usuario.
     *
     * @return O telefone do usuario.
     */
    public String getTelefoneUsuario() {
        return usuarioAtivo.getPessoa().getTelefone();
    }

    /**
     * Acessor do sexo.
     *
     * @return O sexo do usuario.
     */
    public String getGeneroUsuario() {
        return usuarioAtivo.getPessoa().getGenero();
    }

    /**
     *
     * Acessor da foto.
     *
     * @return A foto do usuario.
     */
    public Icon getFotoUsuario() {
        return usuarioAtivo.getPessoa().getFoto();
    }

    /**
     * Altera a senha.
     *
     * @param novaSenha A nova senha do usuario.
     */
    public void setSenhaUsuario(String novaSenha) {
        usuarioAtivo.setSenha(novaSenha);
    }

    /**
     * Altera o nome.
     *
     * @param novoNome O novo nome do usuario.
     */
    public void setNomeUsuario(String novoNome) {
        usuarioAtivo.getPessoa().setNome(novoNome);
    }

    /**
     * Altera o telefone.
     *
     * @param novoTelefone O novo telefone do usuario.
     */
    public void setTelefoneUsuario(String novoTelefone) {
        usuarioAtivo.getPessoa().setTelefone(novoTelefone);
    }

    /**
     * Altera a foto;
     *
     * @param novoGenero O novo genero do usuario.
     */
    public void setGeneroUsuario(char novoGenero) {
        usuarioAtivo.getPessoa().setGenero(novoGenero);
    }

    /**
     * Altera a foto.
     *
     * @param novaFoto A nova foto do usuario.
     */
    public void setFotoUsuario(Icon novaFoto) {
        usuarioAtivo.getPessoa().setFoto(novaFoto);
    }
    
    /**
     * Adiciona uma atividade ao historico.
     * 
     * @param atividade A atividade realizada pelo usuario.
     */
    public void addAtividade(Atividade atividade){
        usuarioAtivo.getHistorico().add(atividade);
    }
    
    /**
     * Acessor do historico.
     * 
     * @return O historico do usuario.
     */
    public List<Atividade> getHistoricoUsuario() {
        return usuarioAtivo.getHistorico();
    }
    
    public boolean pegaItemEmprestado(Item item){
        if (item.getDisponibilidade() == Disponibilidade.DISPONIVEL){
           item.setGuardiao(usuarioAtivo);
           usuarioAtivo.getEstante().adicioarItem(item);
           return true;
        }
        return false;
        
    }
    
    public Disponibilidade getDisponibilidade(Item item){
        return item.getDisponibilidade();
    }
    /**
     * Indica um item a outro usuario.
     * 
     * @param indicacao A indicacao realizada.
     */
    public void indicarItem(Indicacao indicacao){
        usuarioAtivo.addIndicacao(indicacao);
    }
    
    /**
     * Retorna a lista de indicacoes.
     * 
     * @return A lista de indicacoes do usuario ativo.
     */
    public List<Indicacao> retornaIndicacoes(){
        return usuarioAtivo.getIndicacoes();
    }

    /**
     * Adiciona um item a estante do usuario ativo.
     *
     * @param item O item a ser adicionado.
     */
    public void adicionarItem(Item item) {
        usuarioAtivo.getEstante().adicioarItem(item);
    }

    /**
     * Pesquisa os itens do usuario ativo.
     *
     * @return A lista de itens.
     */
    public List<Item> pesquisarItensUsuarioAtivo() {
        return usuarioAtivo.getEstante().getLista();
    }

    /**
     * Comenta um item.
     *
     * @param item O item a ser comentado
     * @param comentario O comentario dado ao item.
     */
    public void comentarItem(Item item, String comentario) {
        for (Usuario usuario : usuarios) {
            List<Item> itens = usuario.getEstante().getLista();
            for (Item i : itens) {
                if (i.equals(item)) {
                    i.adicionaComentario(usuarioAtivo, comentario);
                }
            }
        }
    }

    /**
     * Avalia um item.
     *
     * @param item O item a ser avaliado.
     * @param estrelas A quantidade de estrelas do item.
     */
    public void avaliarItem(Item item, int estrelas) {
        for (Usuario usuario : usuarios) {
            List<Item> itens = usuario.getEstante().getLista();
            for (Item i : itens) {
                if (i.equals(item)) {
                    i.avaliaItem(usuarioAtivo, estrelas);
                }
            }
        }
    }
    
    /**
     * Remove um item da lista do usuario ativo.
     *
     * @param item O item a ser removido.
     */
    public void deletarItem(Item item) {
        for (Item i : usuarioAtivo.getEstante().getLista()) {
            if (i.equals(item)) {
                usuarioAtivo.getEstante().removerItem(item);
            }
        }
    }
    
    /**
     * Acessor de todos os itens.
     * 
     * @return Os itens de todos os usuarios.
     */
    public List<Item> getAllItens(){
        List<Item> itens = new ArrayList<>();
        for (Usuario usuario : usuarios) {
            for (Item item : usuario.getEstante().getLista()){
                itens.add(item);
            }
        }
        return itens;
    }
    
    /**
     * Acessor da lista de itens do usuario ativo.
     * 
     * @return A lista do usuario ativo. 
     */
    public List<Item> getItensUsuarioAtivo(){
        return usuarioAtivo.getEstante().getLista();
    }

    /**
     * Desloga do sistema
     */
    public void desloga() {
        this.usuarioAtivo = null;
    }
}
